地图要素编辑 离线地图要素编辑Sample 在线地图要素编辑Sample
最后更新时间:2019年7月5日
地图要素编辑即对二维地图要素(点、线、区、注记)的添、删、改编辑功能。可以对移动端设备本地存储的离线数据进行编辑,也可以在联网状态下直接对在线地图服务、图层服务进行要素编辑。
要素添加
要素添加功能实现的关键步骤如下图所示:
(1) 构造要素编辑对象(MGSFeatureEdit);
(2) 构造要素对象的三要素,包括属性(NSDictionary)、几何信息(MGSGeometry)、样式信息(MGSGeomInfo);
(3) 根据三要素创建要素(MGSFeature);
(4) 调用要素编辑对象MGSFeatureEdit的append方法执行添加要素。
接下来以离线地图数据点要素添加为例展示具体实现方法:
1
构造要素编辑要素对象有四种方式,根据应用模式分为离线数据编辑和在线数据编辑。用户可根据需求选择相应的方式。
(1)离线数据
//获取矢量图层 MGSVectorLayer *vectorLayer = (MGSVectorLayer *)[_mapView.map getLayerAtIndex:i]; //构造要素编辑对象 MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithVectorLayer:vectorLayer];
//构造数据库对象 MGSDataBase *dataBase=[[MGSDataBase alloc] init]; //.mgdb数据库离线本地路径 NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Map/MapEdit/武汉MKT.mgdb"]; //打开数据库 [dataBase open:dbPath]; //通过数据库初始化简单要素类 MGSSFeatureCls *featureCls=[[MGSSFeatureCls alloc] initWithDataBase:dataBase]; //打开要素图层 [featureCls openWithID:i]; //从1开始 //构造要素编辑对象(通常在只提供.mgdb数据库时使用) MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithIVectorCls:featureCls];
(2)在线数据
在线数据编辑,首先需要在IGServer发布地图文档数据(.mapx),发布成功后获取地图文档信息,如地图文档名称、地图文档基地址、图层索引、图层URL等。在运行要素编辑功能时,需要确保设备网络与IGServer服务器网络连通。
//根据服务基地址、图层URL构造要素编辑对象 MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithIGServerBaseURL:@"http://develop.smaryun.com:6163/igs" dataURL:@"gdbp://MapGisLocal/武汉MKT/sfcls/自绘点"];
//根据服务基地址、地图文档名称、地图索引、图层索引构造要素编辑对象 MGSFeatureEdit *featureEdit=[[MGSFeatureEdit alloc] initWithIGServerBaseURL:@"http://develop.smaryun.com:6163/igs" docName:@"WuHanEdit" mapID:0 layer:8];
2
包括属性信息(NSDictionary)、几何信息(MGSGeometry)、样式信息(MGSGeomInfo)。
NSDictionary<NSString *,NSString *> *pointAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"自定义站", @"Name", nil]; //属性值以键值对形式存在
//几何点对象 MGSGeoPoint *geoPoint=[[MGSGeoPoint alloc] init]; //坐标点 MGSDot3D dot=MGSDot3DMake(12727052.60, 3578030.02, 0); [geoPoint setDot3D:dot];
//点样式信息对象 MGSPntInfo *pntInfo=[[MGSPntInfo alloc] init]; [pntInfo setWidth:600]; //宽 [pntInfo setHeight:600]; //高 [pntInfo setSymID:177]; //符号编号 [pntInfo setOutClr1:6]; //颜色
重要说明:(1)设置的符号编号、颜色值是根据离线地图数据系统库中的符号库、颜色库来决定的(2)地图要素包括点、线、区、注记四种基本类型,具体可以分解为多种几何类型,在接口层面上,它们对应不同的几何对象类、样式信息类。如下图所示:
3
根据三要素创建地图要素。
MGSFeature *pointFeature=[[MGSFeature alloc] initWithAttributes:pointAtt geometry:geoPoint geoInfo:pntInfo];
4
调用要素编辑对象的append方法执行添加要素,并对添加结果进行判断。
//执行点要素的添加操作 long s=[_featureEdit append:pointFeature]; if (s>0) { NSLog(@"添加点要素成功"); //刷新地图 [_mapView forceRefresh]; } else { NSLog(@"添加点要素失败"); }
以上是点要素添加的整个流程,线、区、注记要素的添加实现方法基本一致,区别构造要素对象的三要素方式不同,如下所示:
//属性信息 NSDictionary<NSString *,NSString *> *lineAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"1道路", @"Name_chn", nil]; //几何信息 MGSGeoVarLine *geoVarLine=[[MGSGeoVarLine alloc] init]; MGSDots *dots=[[MGSDots alloc] init]; MGSDot dot1=MGSDotMake(12718853.57, 3583174.04); MGSDot dot2=MGSDotMake(12718935.33, 3574794.53); MGSDot dot3=MGSDotMake(12725802.44, 3571647.10); [dots appendDot:dot1]; [dots appendDot:dot2]; [dots appendDot:dot3]; [geoVarLine setDots2D:dots]; //样式信息 MGSLinInfo *linInfo=[[MGSLinInfo alloc] init]; [linInfo setOutClr1:2]; //颜色
//属性信息 NSDictionary<NSString *,NSString *> *polygonAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"自定义水域", @"Name", nil]; //几何信息 MGSGeoPolygon *geoPolygon=[[MGSGeoPolygon alloc] init]; MGSDots *dots=[[MGSDots alloc] init]; MGSDot dot1=MGSDotMake(12723229.57, 3570597.11); MGSDot dot2=MGSDotMake(12725877.54, 3569563.15); MGSDot dot3=MGSDotMake(12722750.42, 3564973.34); MGSDot dot4=MGSDotMake(12719875.49, 3566032.53); [dots appendDot:dot1]; [dots appendDot:dot2]; [dots appendDot:dot3]; [dots appendDot:dot4]; [dots appendDot:dot1]; MGSIntList *intList=[[MGSIntList alloc] init]; [intList append:(int)dots.size]; [geoPolygon setDots:dots numList:intList]; //样式信息 MGSRegInfo *regInfo=[[MGSRegInfo alloc] init]; [regInfo setFillClr:7]; //填充颜色
//属性信息 NSDictionary<NSString *,NSString *> *annoAtt=[[NSDictionary alloc] initWithObjectsAndKeys:@"长江", @"Name", nil]; //几何信息 MGSTextAnno *textAnno=[[MGSTextAnno alloc] init]; MGSDot dot=MGSDotMake(12730310.39, 3586141.71); [textAnno setAnchorDot:dot]; [textAnno setText:@"长江"]; //样式信息 MGSTextAnnInfo *textAnnInfo=[[MGSTextAnnInfo alloc] init]; [textAnnInfo setColor:4]; [textAnnInfo setHeight:1000]; [textAnnInfo setWidth:1000];
要素添加的展示效果如下图所示:
要素修改
要素修改,包括对地图要素(点、线、区、注记)的属性、几何以及样式信息的编辑,实现的关键步骤如下图所示:
(1) 构造要素编辑对象(MGSFeatureEdit);
(2) 获取待修改要素的ID:获取方式有多种,可以利用地图查询功能获取(通过要素类MGSFeature的ID属性获取)。
(3) 构造要素对象需修改的三要素:几何信息、属性信息、几何图形信息;
(4) 修改要素:调用MGSFeature类的modifyFeatureValue:geometry:info:方法修改;
(5) 要素更新:调用要素编辑对象MGSFeatureEdit的update:ID:方法执行更新,并对修改结果进行判断。
//对要素修改属性、几何、样式信息 long a=[modifyFeature modifyFeatureValue:pointAtt geometry:geoPoint info:pntInfo]; if (a>0) { //更新要素 long b=[_featureEdit update:modifyFeature ID:id]; if (b>0) { NSLog(@"修改要素成功"); //强制刷新地图 [_mapView forceRefresh]; } else { NSLog(@"修改要素失败"); } } else NSLog(@"要素更新值失败");
说明:在修改要素时,如果只需要对要素的属性、几何、样式信息中的部分信息进行修改,只需传入对应的信息对象即可,其他信息可传nil。
要素删除
要素删除,同样分为点、线、区、注记要素的删除。要素删除通过要素的唯一标识ID定位要素,执行删除。要素删除功能实现的关键步骤如下图所示:
(1) 构造要素编辑对象(MGSFeatureEdit);
(2) 获取要删除的要素的ID:要素ID一般通过地图要素查询方法获取;
(3) 要素删除:调用要素编辑对象的deleteWithID:方法执行删除要素,并对删除结果进行判断。
//删除要素 long s=[_featureEdit deleteWithID:id]; if (s>0) { NSLog(@"删除要素成功"); [_mapView forceRefresh]; } else { NSLog(@"删除要素失败"); }
交互式要素编辑 Sample详情
在实际项目应用中,经常采用交互式的要素编辑操作,这样能够使得应用更简便、易用、高效、实用。交互要素编辑,其实也就是地图手势事件与要素编辑两部分功能的结合。具体代码在此不展开讲述,可参考示例中心的示例。实现效果如下: